Amazon RDSをAuroraにできるだけ簡単に移行&メジャーアップグレードしてみた ~RDS MySQL 5.7からAurora MySQL 8.0への移行を例に~

Amazon RDSをAuroraにできるだけ簡単に移行&メジャーアップグレードしてみた ~RDS MySQL 5.7からAurora MySQL 8.0への移行を例に~

Clock Icon2024.01.29

Amazon RDS のMySQL 5.7やPostgreSQl 11が2024年2月末に標準サポートを終了するのに伴い、RDS延長サポート費用を支払って継続利用するか、メジャーアップグレードする選択が迫られています。

今回の標準サポートを終了を期に、メジャーアップグレードだけでなくRDSからAuroraへの移行、具体的には、RDS MySQL 5.7から Aurora MySQL 8.0への移行を支援する機会がありましたので、共有します。

PostgreSQLでも同様のことが成り立つかと思います。

なお、本記事では、RDSとAuroraの対比がわかりやすいように "Amazon RDS for MySQL 5.7""RDS MySQL 5.7""Amazon Aurora MySQL 3(MySQL 8.0互換)""Aurora MySQL 8.0" というように表記しています。

要件

  • RDS MySQL 5.7からAurora MySQL 8.0に移行
  • 数時間のまとまったダウンタイムは許容できる
  • DBAのようなデータベーススペシャリストに依存しない移行方式
  • Aurora MySQLのLTSバージョン(3.04.0、MySQL 8.0.28 互換)を移行先とする

つまるところ、まとまった計画メンテナンス時間を確保できる前提で、リスクを減らした理解し易い単純明快な移行計画が求められます。

そのため、AWSのマネージド機能を積極活用しています。

移行方法

RDS MySQL 5.7から Aurora MySQL 8.0へ移行する場合、以下の2つの処理が伴います

  • 実行基盤をRDSからAuroraへ移行
  • データベースエンジンをMySQL 5.7 からMySQL 8.0へメジャーアップグレード

RDS MySQL 8.0を経由する方法とAurora MySQL 5.7を経由する方法の2通りがあり、AWS側の複数回の仕様変更により、最終的にはAurora MySQL 5.7を経由する方式を採用しました。

移行時の制約

主にAWSを起因とした移行時の制約を述べます

  • RDS 5.7からAurora 8.0へ一回で移行できない
    • 2024年02月頃までは可能だった
  • RDS 5.7からRDS 8.0へ移行する際、標準サポートから外れているバージョンへは移行できない
    • Aurora 8.0のLTSバージョンの3.04.0、MySQL 8.0.28 互換への移行のために、一度 RDS 8.0.28 へ移行予定だったが、RDS 8.0.28が標準サポートから外れた2024年05月頃からこの手順を踏めなくなり、Aurora 5.7を経由することになった

スナップショットの作成

移行作業開始時に手動スナップショットを作成して、このスナップショットから移行作業を行います。

$ aws rds create-db-snapshot \
    --db-instance-identifier mydbinstance \
    --db-snapshot-identifier mydbsnapshot 

旧本番データベースは直接更新していないため、移行失敗時に特別なリカバリ作業は発生しません。

RDSからAuroraへの実行基盤の移行

RDS 5.7のスナップショットからAurora 8.0へ直接移行できないため、一旦Aurora 5.7のクラスターを作成します。

$ aws rds restore-db-cluster-from-snapshot \
--snapshot-identifier arn:aws:rds:ap-northeast-1:1234:snapshot:mysql57-manual \
--engine-version 5.7.mysql_aurora.2.12.2 \
--db-cluster-identifier your-new-aurora-cluster \
--engine aurora-mysql \
--db-cluster-parameter-group-name default.aurora-mysql5.7 \
--vpc-security-group-ids your-security-group \
--db-subnet-group-name your-subnet-group \
--deletion-protection

また、Aurora 5.7からAurora 8.0へのメジャーアップグレードではAuroraクラスター内にインスタンスも必要です。5.7バージョンのインスタンスをレプリカも含めて2台追加します。

$ aws rds create-db-instance \
  --db-cluster-identifier your-new-aurora-cluster \
  --db-instance-identifier prd-instance-1a \
  --engine aurora-mysql \
  --engine-version 5.7.mysql_aurora.2.12.2 \
  --db-instance-class db.r6g.large \
  --availability-zone ap-northeast-1a

$ aws rds create-db-instance \
--db-cluster-identifier your-new-aurora-cluster \
--db-instance-identifier prd-instance-1c \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.12.2 \
--db-instance-class db.r6g.large \
--availability-zone ap-northeast-1c

Auroraエンジンのメジャーアップグレード

DBエンジンをメジャーアップグレードする場合、以下の様なアプローチがあります。

  • Blue/Greenデプロイメント
  • インプレースアップグレード
方法 手順 ダウンタイム エンドポイント 切り戻し先
Blue/Green 普通 瞬断 同じ 残る
インプレース シンプル 長い 同じ スナップショットからリストア

今回は、RDSからAuroraへのメジャーアップグレードであり、移行元のRDS 5.7は手つかずのまま残っているため、Aurora間のメジャーアップグレードにはインプレースアップグレードを採用することにしました。

$ aws rds modify-db-cluster \
  --db-cluster-identifier your-new-aurora-cluster \
  --engine-version 8.0.mysql_aurora.3.04.2 \
  --db-cluster-parameter-group-name aurora-cluster-mysql-80 \
  --allow-major-version-upgrade \
  --apply-immediately

インプレースアップグレードでは、アップグレード前に、「preupgrade-<クラスター名>-5-7-XXX-YYYY-MM-DD-HH-SS」 という命名規則のスナップショットが自動的に作成されるため、アップグレード前の手動のスナップショットの取得は不要です。

この2つの違いは以下の通りです。

Blue/Greenデプロイメント

RDS間、及び、Aurora間でメジャーアップグレードする場合、Blue/Greenデプロイメントが使えます。

ダウンタイムはスイッチオーバー時の一瞬ですし、アプリケーションの接続先が同じになるようなエンドポイントの調整や、切り替え時のデータロス対策等がフルマネージドで行われ、切り戻し先も残ります。

RDSあるいはAuroraに閉じて短いダウンタイムでメジャーアップグレードするのであれば最有力です。

インプレースアップグレード

インプレースアップグレードでは、クラスターを直接メジャーアップグレードします。

小難しそうな名前ですが、操作としてはコンソールの編集画面でバージョンを変更するだけの一番直感的なバージョンアップ方法です。 当然ながら、エンドポイントも維持されます。

既存クラスターを直接変更するため、切り戻したい場合は、インプレースアップグレード開始時に取得されるスナップショットからリストアします。

最後に

MySQLのメジャーアップグレード移行手順を一度決定してから、わずか数ヶ月の間に、AWS側の仕様変更により移行手順が複数回変更になりました。

見通しのよいシンプルな移行手順をAWS CLIのスクリプトに落として移行リハーサルしていたため、手順の確認や仕様変更への手順の追従も比較的スムーズに行えました。

参考

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.